/* Includes ------------------------------------------------------------------*/
#include <main.h>

/* Private define-------------------------------------------------------------*/
#define MP2451_PWR_EN   P54
#define MP2451_PWR_EN_OFF   (bit)0
#define MP2451_PWR_EN_ON    (bit)1

#define IIC_SCL P23
#define IIC_SDA P22
/* Private variables----------------------------------------------------------*/
static void Run(void);          //系统运行
static void StandBy(void);      //系统待机
static void Halt(void);         //系统运行
/* Public variables-----------------------------------------------------------*/
System_t idata System =
{
    System_Run,

    Run,
    StandBy,
    Halt
};
/* Private function prototypes------------------------------------------------*/

/*
* @name   Run
* @brief  系统运行
* @param  None
* @retval None   
*/
static void Run()
{
    static uint16_t i = 0;
    //获取PCB板温度
    NTC.Get_Temperature_Value();
    //数码管显示温度
    TM1620.Disp_Tempareture();

    //按键2双击
    if(KEY2.Double_Click == TRUE)
    {
        KEY2.Double_Click = FALSE;
        //连接TCP服务器
        ESP8266.TCP_Connect_Server();
    }
    //接收TCP服务器信息
    ESP8266.Receive_Information();
    //将温度通过TCP传到服务器
    ESP8266.Transfer_Tempareture(NTC.fTemperature);

    i = 500;
    while(i--)
    {
        Public.Delay_ms(1);
        //状态机扫描按键2
        KEY2.KEY_Detect();

        if(UART1.ucRec_Flag == TRUE)
        {
            break;
        }
        if(KEY1.KEY_Flag == TRUE)
        {
            break;
        }
        if(KEY2.KEY_Flag == TRUE)
        {
            break;
        }
    }
    //按键1检测，长按2S进入待机模式
    KEY1.KEY_Detect();
    //模块配网
    ESP8266.SmartConfig();
    //按键1触发调整PWM灯亮度
    PWM.PWM_LED_Adjust_Brightness();
    //串口1协议解析
    UART1.Protocol();
}

/*
* @name   StandBy
* @brief  系统待机
* @param  None
* @retval None   
*/
static void StandBy()
{
    //进入停机模式
    System.Halt();
}

/*
* @name   Halt_Enter_Config
* @brief  进入停机配置
* @param  None
* @retval None   
*/
static void Halt_Enter_Config()
{
    //关闭MP2451
    MP2451_PWR_EN = MP2451_PWR_EN_OFF;

    //关闭运行指示灯
    Run_LED.Run_LED_OFF();

    //关闭PWM灯
    PWM.PWM_Duty_Set(Duty_0);

    //关闭ADC电源，最高位电源控制位置0
    ADC_CONTR &= ~ADC_POWER;    

    //防止TM1620漏电
    //在TM1620.h定义的宏名
    STB = 0;
    CLK = 0;
    DIN = 0;

    //防止串口TX漏电
    //在UART1.h定义的宏名
    UART1_TTL_TX   = 0;
    UART1_RS485_TX = 0;
    UART2_TX       = 0;

    //防止串口RX漏电
    //要先把RX对应的端口设置为推挽模式，再输出低电平
    //P36(RS-485的RX)、P30(TTL的RX)、P10(ESP-12S的RX)设置为推挽输出
    P3M1 &= ~(BIT0+BIT6);       //0000 0000
    P3M0 |= BIT0+BIT6;          //0100 0001

    P1M1 &= ~(BIT0);
    P1M0 |= BIT0;

    UART1_RS485_RX  = 0;    //P36
    UART1_TTL_RX    = 0;    //P30
    UART2_RX        = 0;    //P10

    //防止IIC口漏电
    IIC_SCL = 0;
    IIC_SDA = 0;

    //防止WIFI模块漏电
    WIFI_EN     = 0;
    WIFI_RST    = 0;
}

/*
* @name   Halt_Exit_Config
* @brief  退出停机配置
* @param  None
* @retval None   
*/
static void Halt_Exit_Config()
{
    //打开MP2451
    MP2451_PWR_EN = MP2451_PWR_EN_ON;

    //运行指示灯，立马闪烁
    Timer0.msMCU_Timer0_Value = TIMER_1S;

    //恢复PWM灯
    PWM.PWM_Duty_Set(PWM.Duty);

    //打开ADC电源
    ADC_CONTR |= ADC_POWER;

    //恢复TM1620
    STB = 1;
    CLK = 1;
    DIN = 1;

    //恢复串口TX
    UART1_TTL_TX   = 1;
    UART1_RS485_TX = 1;
    UART2_TX       = 1;

    //恢复串口RX
    //先将RX口设置为高阻输入，再输出高电平
    P3M1 |= (BIT0+BIT6);
    P3M0 &= ~(BIT0+BIT6);

    P1M1 |= BIT0;
    P1M0 &= ~BIT0;

    UART1_TTL_RX    = 1;
    UART1_RS485_RX  = 1;
    UART2_RX        = 1;

    //恢复IIC端口
    IIC_SCL = 1;
    IIC_SDA = 1;

    //恢复WIFI模块，重新初始化
    ESP8266.Init();
}

/*
* @name   Halt
* @brief  系统停机模式，只能外部中断唤醒
* @param  None
* @retval None   
*/
static void Halt()
{
    //串口打印调试信息
    #ifdef Monitor_Run_Code
        printf("The MCU enter halt mode!\r\n\r\n");
    #endif

    //喂狗
    WatchDog.Feed();
    
    //进入停机配置
    Halt_Enter_Config();

    //进入掉电模式
    PCON |= BIT1;   //这里单片机已经停止运行，只有外部中断来了才能唤醒继续向下执行
    /*被唤醒后，手册要求执行4个空操作，因为单片机启动后可能不太稳定，所以
	用空操作等待系统稳定*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    //退出停机配置
    Halt_Exit_Config();
    
    //串口打印调试信息
    #ifdef Monitor_Run_Code
        printf("The MCU Exit halt mode!\r\n");
    #endif

    System.ucSystem_Statues = System_Run;   //系统正常运行
    KEY1.KEY_Flag = FALSE;
}
/********************************************************
  End Of File
********************************************************/